package com.ymk;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.FileType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.ymk.base.BaseVO;

import java.io.File;

/**
 * 生成实体类
 */
public class dbMain {
    public static void main(String[] args) {
        //需要构建一个 代码生成器 对象
        AutoGenerator mpg = new AutoGenerator();
        //配置策略
        //1. 全局配置
        GlobalConfig gc = new GlobalConfig();
        //获取当前 系统目录
        String property = System.getProperty("user.dir");
        gc.setOutputDir(property + "/modules/module-gocder/src/main/java");
        gc.setAuthor("胡泽鑫");//作者注释
        gc.setOpen(false);//是否打开资源管理器
        gc.setFileOverride(false);//是否覆盖
        gc.setIdType(IdType.AUTO);
        gc.setDateType(DateType.ONLY_DATE);
        gc.setSwagger2(false);



        mpg.setGlobalConfig(gc);

        // 2. 设置数据源
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://sh-cynosdbmysql-grp-2g4uhxio.sql.tencentcdb.com:27587/ymk_sop");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("838f9fec-a609-4242-8a04");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);

        //3. 包的配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.ymk");
        pc.setEntity("entity");
        pc.setMapper("mapper");
        mpg.setPackageInfo(pc);


        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        cfg.setFileCreate((configBuilder, fileType, filePath) -> {
            //如果是Entity则直接返回true表示写文件
            if (fileType == FileType.ENTITY) {
                return true;
            }
            //否则先判断文件是否存在
            File file = new File(filePath);
            boolean exist = file.exists();
            if (!exist) {
                file.getParentFile().mkdirs();
            }
            //文件不存在或者全局配置的fileOverride为true才写文件
            return !exist || configBuilder.getGlobalConfig().isFileOverride();
        });
        mpg.setCfg(cfg);

        //4. 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        strategy.setEntityTableFieldAnnotationEnable(true);
        strategy.setSuperEntityClass(BaseVO.class);

        //5.自动填充策略
        strategy.setVersionFieldName("version");
        strategy.setLogicDeleteFieldName("deleted");
        mpg.setStrategy(strategy);

        //6.配置自定义模板
        //设置模板引擎    注意！如果您选择了非默认引擎，需要在 AutoGenerator 中 设置模板引擎
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
       /*  配置自定义输出模板
        指定自定义模板路径， 位置：/resources/templates/entity.java.ftl(或者是.vm)
         注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别*/
        TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.setController(null);
        templateConfig.setService("/templates/service.java");
        templateConfig.setServiceImpl("/templates/serviceImpl.java");
        templateConfig.setMapper(null);
        templateConfig.setEntity("/templates/entity.java");
        templateConfig.setXml("/templates/mapper.xml");
        mpg.setTemplate(templateConfig);



        AutoGenerator generator = new AutoGenerator();

        // set freemarker engine
        generator.setTemplateEngine(new FreemarkerTemplateEngine());

        mpg.execute();
    }

}
